perm filename TTYIO.MAC[11,HE] blob sn#554606 filedate 1981-01-01 generic text, type T, neo UTF8
.TITLE TTY I/O TEST PROGRAM

        .MCALL ALUN$S,GLUN$S,QIOW$S,EXIT$S,GREG$S

        .BLKW 100                       ;Make some stack space
SPSTRT:

REGBUF: .BLKW 3                         ;To stick region info into
TSTMRK: .WORD 123456,123123             ;To test we got right UNIBUS address

RDSTS:  .WORD 0                         ;Read status block
RDCNT:  .WORD 0

WRSTS:  .WORD 0,0                       ;Write status block

STATBF: .BYTE TC.SCP                    ;Ask if CRT
CRTP:   .BYTE 0

NUMBUF: .BLKB 12.
BUFFER: .BLKB 82.
PROMPT: .ASCII /(0):/

HIMES:  .ASCII /TTY IO TEST PROGRAM/
HISIZE = .-HIMES
ECHMES: .ASCII /NOW DO SOME TTY ECHOING:/
ECHSIZ = .-ECHMES
YESCRT: .ASCII /WE ARE A CRT/
YCRTSZ = .-YESCRT
NOTCRT: .ASCII /WE ARE NOT A CRT/
NCRTSZ = .-NOTCRT
ADRMES: .ASCII /BASE ADDRESS OF TASK REGION (*100) & LOCAL OFFSET/
ADRSIZ = .-ADRMES
BYEMES: .ASCII <15><12>/THAT'S ALL FOR NOW/
        .ASCII <15><12>/How well did we do?/
        .ASCII <15><12>/So long sucker./<15><12>
BYESIZ = .-BYEMES
.EVEN

START:  MOV #SPSTRT,SP                  ;Set up stack???
        ALUN$S #1,#"TI,#0               ;LUN 1 is TI: device
        BCC 10$
        JMP ERROR                       ;Punt if error
10$:    QIOW$S #IO.ATT,#1,#1            ;Attach it
        BCC 11$
        JMP ERROR                       ;Punt if error
11$:    QIOW$S #IO.WLB,#1,#1,,#WRSTS,,<#HIMES,#HISIZE,#40>      ;Say Hello
        BCC 12$
        JMP ERROR                       ;Punt if error
12$:    QIOW$S #SF.GMC,#1,#1,,,,<#STATBF,#2>    ;See what sort of a tty we are
        BCC 13$
        JMP ERROR               ;Punt if error
13$:    MOV #YESCRT,R0          ;Assume we are a CRT
        MOV #YCRTSZ,R1
        TSTB CRTP               ;Now see what we really are
        BNE 1$                  ;Yes we are a CRT
        MOV #NOTCRT,R0          ;No we aren't
        MOV #NCRTSZ,R1
1$:     QIOW$S #IO.WLB,#1,#1,,#WRSTS,,<R0,R1,#60>       ;Say what we are
        BCC 16$
        JMP ERROR                       ;Punt if error

16$:    CLR R1                          ;Count a little
2$:     JSR PC,OUTNUM                   ;Print number out
        INC R1
        CMP R1,#20
        BLE 2$
        MOV #123456,R1                  ;And one big one
        JSR PC,OUTNUM                   ;Print it out

        QIOW$S #IO.WLB,#1,#1,,#WRSTS,,<#ADRMES,#ADRSIZ,#60> ;Type address info
        BCC 17$
        JMP ERROR                       ;Punt if error
17$:    GREG$S ,#REGBUF                 ;Get region base address
        BCC 18$
        JMP ERROR
18$:    MOV REGBUF,R1
        JSR PC,OUTNUM                   ;Print it out
        MOV #TSTMRK,R1                  ;Give local address of test data
        JSR PC,OUTNUM                   ;Print it out

        QIOW$S #IO.WLB,#1,#1,,#WRSTS,,<#ECHMES,#ECHSIZ,#60> ;Say we'll echo now
        BCC 14$
        JMP ERROR                       ;Punt if error
14$:    MOVB #60,PROMPT+1               ;Reset prompt counter
3$:     QIOW$S #IO.RPR,#1,#1,,#RDSTS,,<#BUFFER,#80.,,#PROMPT,#4,#44> ;Get a line
        BCC 15$
        JMP ERROR                       ;Punt if error
15$:    MOV RDCNT,R1                    ;See how many characters were typed
        JSR PC,OUTNUM
        QIOW$S #IO.WLB,#1,#1,,#WRSTS,,<#BUFFER,R1,#40>  ;Echo the line back
        BCS ERROR                       ;Punt if error
        INCB PROMPT+1                   ;Update prompt counter
        CMPB #71,PROMPT+1               ;More to do?
        BGE 3$                          ;Yup - keep going

        QIOW$S #IO.WLB,#1,#1,,#WRSTS,,<#BYEMES,#BYESIZ,#0>  ;Say good bye
        BCS ERROR                       ;Punt if error

        EXIT$S ERROR                    ;Go away

        JMP START                       ;?????

ERROR:  IOT                             ;Crash if any errors


;Auxiliary routine to print out the octal number in R1

OUTNUM: MOV R0,-(SP)    ;We need some free registers
        MOV R1,-(SP)
        MOV R2,-(SP)
        MOV R3,-(SP)
        MOV #NUMBUF,R2  ;Where we'll stick the result
        CLR R0
        MOV #6,R3       ;6 digits to print
        ASHC #1,R0      ;Get high order digit
1$:     TST R0          ;Don't print leading zeros
        BNE 2$          ;Found highest order non-zero digit
        ASHC #3,R0      ;Try next
        SOB R3,1$
        INC R3
2$:     ADD #60,R0      ;Convert to ASCII
        MOVB R0,(R2)+   ;Stick it in buffer
        CLR R0
        ASHC #3,R0      ;Move on to next digit
        SOB R3,2$       ;Do them all
        SUB #NUMBUF,R2  ;Get character count for writing
        QIOW$S #IO.WLB,#1,#1,,#WRSTS,,<#NUMBUF,R2,#40>  ;Type it out
        BCS ERROR       ;Punt if error
        MOV (SP)+,R3    ;Restore registers
        MOV (SP)+,R2
        MOV (SP)+,R1
        MOV (SP)+,R0
        RTS PC

.END START